home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
BASIC
/
2905.ZIP
/
QWEZ.ZIP
/
SCRLRAND.BAS
< prev
next >
Wrap
BASIC Source File
|
1993-06-01
|
17KB
|
365 lines
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'!!! ** [ READ THIS ] ** !!!!!!!! ** [ READ THIS ] ** !!!
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
' DATA FILE, RANDDATA.DAT REQUIRED FOR THIS PROGRAM -- SEE SCRLFILE.DOC
'***************************************************************************
'**** THIS PROGRAM MUST BE USED WITH ONE OF THE FOLLOWING LIBRARIES: ****
'***************************************************************************
'**** For QB4.5 unenhanced version use QBUNEN.QLB ****
'**** For BASIC 7.1 unenhanced version use PDSUNEN.QLB ****
'**** For VBDOS 1.0 unenhanced version use VBUNEN.QLB ****
'**** For QB4.50 enhanced version use QBALL.QLB or QBNER.QLB ****
'**** For BASIC 7.1 enhanced version use PDSALL.QLB or PDSNER.QLB ****
'**** For VBDOS 1.0 enhanced version use VBALL.QLB or VBNER.QLB ****
'**** Load QB, QBX, or VBDOS with the /L option and the correct library ****
'***************************************************************************
' INSTRUCTIONS
' ------------
' 1. MAKE SURE THE DATA FILE, RANDDATA.DAT, IS IN THE CURRENT
' DRIVE/DIRECTORY. IF THE DATA FILE IS NOT AVAILABLE IT MAY BE
' MADE USING MAKERAND.BAS ( SEE SCRLFILE.DOC ).
' 2. LOAD QUICKBASIC OR PDS WITH THE CORRECT LIBRARY. ( SEE ABOVE )
' 3. LOAD SCRLRAND.BAS ( THIS PROGRAM ) INTO QB OR QBX.
' 4. RUN THE PROGRAM. ( SHIFT F5 )
'
' **** SEE SCRLFILE.DOC FOR ADDITIONAL INFORMATION ****
'***************************************************************************
DECLARE FUNCTION LBUTTON% ()
DECLARE FUNCTION MOUSEINWIND% (W%)
DECLARE FUNCTION MOUSEON% (ONOFF%)
DECLARE FUNCTION CHOICEBAR% (CH$(), TR%, LC%, WD%, ATTR%, HATTR%, EXIT$)
DECLARE FUNCTION CHOICEWIND% (TITLE$, T$(), C$(), TR%, LC%, ATTR%, HATTR%, ESCEX%, BRDR%)
DIM CH$(3)
CH$(1) = "ENTER=SELECT": CH$(2) = "ESC=EXIT": CH$(3) = "F1=FIND"
CALL SETWIND(1, 1, 7, 0, 15) ' INITIALIZE WINDOW MEMORY.
CALL INPTINIT(1, 1, 0, 1, 1) ' INITIALIZE INPUT MEMORY.
JUNK% = MOUSEON%(1) ' INITIALIZE MOUSE AND TURN IT "ON".
CALL MAKEWIND(1, "", 1, 1, 80, 25, 112, 2)
CALL CUROFF
DO
ANS$ = ""
CALL GETANS("Color or Mono (C/M) ?", "CM", ANS$, 100, 100, 143, 0, 11)
IF ANS$ = "C" THEN COL% = 31 ELSE COL% = 112
LOOP WHILE ANS$ = CHR$(27)
CALL BOXW(21, 10, 59, 3, 2)
IF COL% = 31 THEN A% = 31 ELSE A% = 15
CALL INFOLINE(25, 2, 78, A%) ' TURN INFO-LINE ON.
'---------------------------------------------------------------------------
' DESCRIPTION WINDOW
CALL MAKEWIND(2, "@Virtual scroll window template - Using random file access", 2, 100, 74, 8, COL%, 111)
CALL PRINTW("This scroll window scrolls through a random access file. It holds 5", 1, 2)
CALL PRINTW("records at a time. This eliminates the need to place the entire file", 2, 2)
CALL PRINTW("in memory, minimizing precious string space usage. This template may", 3, 2)
CALL PRINTW("be used with binary or indexed files with slight modification.", 4, 2)
'---------------------------------------------------------------------------
' MAKE THE WINDOW TO BE USED AS THE SCROLL WINDOW.
' INITIALIZE VARIABLES
FILEPOINTER = 1 ' START AT RECORD# 1.
RTRN% = 1 ' SCROLL BAR OVER 1ST ENTRY.
ROWS% = 5 ' INTERIOR ROWS IN SCROLL WINDOW.
' IF WINDOW HAS A TITLE BOX ROWS% = NUMBER OF
' WINDOW ROWS - 4 ELSE ROWS% = NUMBER OF WINDOW
' ROWS - 2.
DIM A$(ROWS%) ' DIMENSION ARRAY TO HOLD SCROLL WINDOW ENTRIES.
FC% = 1 ' THE FIRST CHARACTER FOR ENTRIES IN SCROLL WINDOW
' PRINTS IN THE FIRST COLUMN IN THE WINDOW.
' WITH VIRTUAL SCROLL WINDOWS THE CHARACTER IN THE
' 1st COLUMN IS NOT ALWAYS THE 1st CHARACTER.
DATAFILE$ = "RANDDATA.DAT" ' DATA FILE
FILENUM% = 1 ' USE FILE NUMBER 1
DIM DUMMY$(0) ' SCROLL WINDOW REQUIRES THIS FOR INFOLINE
TYPE RECORDTYPE ' PLACE YOUR OWN TYPE HERE
MARK AS STRING * 1
NAM AS STRING * 25
ADD1 AS STRING * 30
CITY AS STRING * 25
STATE AS STRING * 10
ZIP AS STRING * 9
END TYPE
DIM RECORD AS RECORDTYPE
RECORDLEN% = LEN(RECORD)
CALL MAKEWIND(20, "", 12, 100, 74, ROWS% + 4, COL%, 111) ' SCROLL WINDOW
' SCROLL WINDOW'S TITLE
TITLE$ = "NAME ADDRESS CITY STATE ZIP"
' --------------------------------------------------------------------------
' FIND THE NUMBER OF RECORDS IN THE FILE BASED ON THE RECORD LENGTH.
OPEN DATAFILE$ FOR RANDOM AS FILENUM% LEN = RECORDLEN%
MAXENTRIES = LOF(1) / RECORDLEN%
CLOSE
OPEN DATAFILE$ FOR RANDOM AS FILENUM% LEN = RECORDLEN%
RK% = CHOICEBAR%(CH$(), 23, 5, 70, 112, 0, "VIEW")
GETFILE:
GOSUB GETRECORDS
' ---------------------------------------------------------------------------
' PRINT THE INSTRUCTIONS AND PLACE THE RECORDS IN THE SCROLL WINDOW.
CALL PRINTW("[ (+) = Mark ]■■■■■■■■■[ (-) = Unmark ]", 6, 100)
MAKESCRL:
IF ENTRIES% < 1 THEN CALL PRINTW("No entries..", 1, 100): END
' KIND$ REPRESENTS TYPE OF SCROLL WINDOW ON ENTRY AND THE MARKED ENTRIES
' ON EXIT.
' SET KIND$ TO "M" TO MAKE A "MARKED" SCROLL WINDOW.
CALL INFOFIXED(" Up/Down/Left/Right -- Pgup/Pgdn -- Home/End -- Tab/Shift Tab -- Mouse")
KIND$ = "M" ' THIS IS A "MARK" SCROLL WINDOW.
' SET EXIT CRITERIA AND MARKED ENTRIES.
CALL B4SCRL("MCT1REXO", SCROLLMARK$, 0, NOREFRESH%)
NOREFRESH% = 0
' ENTER THE SCROLL WINDOW
CALL SCRLWIND(A$(), DUMMY$(), TITLE$, ENTRIES%, KIND$, RTRN%, LI%, FC%, RK%, 0, 1, 0)
CALL INFOFIXED("") ' ERASE THE FIXED INFO STRING.
IF RK% = 200 OR RK% = 14 OR RK% = 15 THEN ' Mouse pressed out of scroll window
CALL PRINTW("─────────", 6, 100)
RK% = CHOICEBAR%(CH$(), 23, 5, 70, 112, 0, "1EOT")
SELECT CASE RK%
CASE 1: RK% = 13 ' simulate ENTER
CASE -1, 3: RK% = 1 ' simulate F1
CASE 2: RK% = 27 ' simulate ESC
CASE ELSE: NOREFRESH% = 1 ' Mouse pressed out of a selection
END SELECT
'loop if lbutton is pressed with mouse out of scroll window
DO: LOOP WHILE LBUTTON% = 1 AND MOUSEINWIND%(20) = 0
CALL PRINTW("■■■■■■■■■", 6, 100)
END IF
'----------------------------------------------------------------------------
' RK% = 50 IF THE + OR INSERT (MARK) KEY CAUSED THE EXIT.
' RK% = 55 IF THE - OR DELETE (UN-MARK) KEY CAUSED THE EXIT.
' KIND$ HOLDS THE CODED STRING FOR MARKED ITEMS ON EXIT.
' SET SCROLLMARK$ TO KIND$ FOR NEXT ENTRY INTO SCROLL WINDOW.
' NOTE: REQUIRES A FIELD IN THE DATABASE RESERVED FOR THE MARK FLAG.
SELECT CASE RK%
'( KIND$ RETURNED BY SCRLWIND -- REPRESENTS MARKED ITEMS )
CASE 50, 55 '+/INSERT FOR MARK OR -/DELETE FOR UNMARK CAUSED EXIT
IF ONLAST% = 1 THEN ' MOVE FILEPOINTER TO
FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN SCROLL
ONLAST% = 0 ' WINDOW.
END IF
IF KIND$ = "" THEN 'NOTHING MARKED
RECORD.MARK = " ": SCROLLMARK$ = SPACE$(ENTRIES%)
ELSE ' AT LEAST ONE ENTRY MARKED
RECORD.MARK = MID$(KIND$, RTRN%, 1): SCROLLMARK$ = KIND$
END IF
PUT 1, FILEPOINTER + RTRN% - 1, RECORD.MARK ' PUT MARK FLAG IN CORRECT
' RECORD IN FILE.
RTRN% = RTRN% + 1 ' ADVANCE TO NEXT RECORD.
IF RTRN% > ENTRIES% THEN RK% = 19: GOTO DOWN ' ELSE ACT LIKE DOWN ARROW
'---------------------------------------------------------------------------
' THE ESC KEY CAUSED THE EXIT FROM THE SCROLL WINDOW
CASE 27
CALL PRINTINFO(" Press Y to quit or N to continue. Press ENTER to accept..")
ANS$ = "N"
CALL GETANS("Quit (Y/N) ", "YN", ANS$, 100, 100, 112, 15, 11)
IF ANS$ = "Y" THEN CLOSE : CLS : END
NOREFRESH% = 1
'---------------------------------------------------------------------------
' THE ENTER KEY CAUSED THE EXIT ---- AN ENTRY WAS SELECTED.
' USING MULTINPT THE RECORD COULB BE EDITED HERE.
CASE 13
IF ONLAST% = 1 THEN ' SET FILE POINTER TO THE
FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN WINDOW.
ONLAST% = 0
END IF
'( SELECTED RECORD = FILEPOINTER + RTRN% - 1 )
CALL PRINTINFO(" Press any key to continue.......... ")
CALL GETANS("Selection was record number:" + STR$(FILEPOINTER + RTRN% - 1), "", "", 8, 100, 15, 0, 11)
NOREFRESH% = 1
'---------------------------------------------------------------------------
' THE HOME KEY CAUSED THE EXIT
CASE 30
FC% = 1 ' START WITH 1ST CHARACTER IN 1ST COLUMN
FILEPOINTER = 1 ' START AT RECORD 1
RTRN% = 1 ' SCROLL BAR ON 1ST RECORD IN SCROLL WINDOW.
GOSUB GETRECORDS ' FILL A$() WITH THE RECORDS
'---------------------------------------------------------------------------
' THE END KEY CAUSED THE EXIT
CASE 35
FC% = 1 ' 1ST CHARACTER IN 1ST COLUMN
FILEPOINTER = MAXENTRIES - ROWS% + 1 ' LAST "ROWS%" OF RECORDS
IF FILEPOINTER < 1 THEN FILEPOINTER = 1 ' ADJUST IF < 1
GOSUB GETRECORDS ' GET RECORDS TO FILL WINDOW
RTRN% = ENTRIES% ' SCROLL BAR ON LAST RECORD
'---------------------------------------------------------------------------
' THE F1 KEY ( FIND ) CAUSED THE EXIT
CASE 1
DO
CALL DOSOUND
RTRN$ = ""
CALL PRINTINFO(" Input a record number. Press ENTER to accept or ESC to abort.")
CALL INPTWIND(" FIND RECORD NUMBER ( 1 TO" + STR$(MAXENTRIES) + " ) ", "0", 100, 100, 3, 112, 112, RTRN$, RKEY%, 2, 111)
REC = VAL(RTRN$)
' CHECK FOR PROPER RANGE FOR INPUT
LOOP WHILE (REC < 1 OR REC > MAXENTRIES) AND RKEY% <> 27
CALL RSTRINPT(1) ' RESTORE INPUT WINDOW.
IF RKEY% = 27 THEN GOTO MAKESCRL ' ESC WAS PRESSED.
GOTREC:
IF ONLAST% = 1 THEN ' FILE POINTER TO
FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' 1ST RECORD IN WINDOW.
ONLAST% = 0
END IF
FC% = 1 ' 1ST CHARACTER IN 1ST COLUMN.
OLDREC = FILEPOINTER ' SAVE THE OLD FILEPOINTER.
FILEPOINTER = REC ' SET FILEPOINTER TO ENTERED
' RECORD.
IF REC <= ROWS% THEN ' RECORD = 1 TO ROWS%
RTRN% = REC ' SCROLL BAR ON ENTERED RECORD
FILEPOINTER = 1 ' 1ST RECORD = 1ST WIND. ENTRY
ELSEIF REC > MAXENTRIES - ROWS% THEN ' RECORD = MAXENTRIES - ROWS%
RTRN% = ROWS% - (MAXENTRIES - REC) ' TO MAXENTRIES.
FILEPOINTER = MAXENTRIES - ROWS% + 1 ' JUST LIKE "END".
ELSEIF REC >= OLDREC AND REC <= OLDREC + ROWS% - 1 THEN
FILEPOINTER = OLDREC ' RECORD IN PRESENT WINDOW
RTRN% = (REC - OLDREC + 1)
ELSE ' RECORD = ALL OTHERS.
RTRN% = 1 ' SCROLL BAR ON 1ST WIND ENTRY.
FILEPOINTER = REC ' ENTRERED RECORD 1ST IN WIND.
END IF
GOSUB GETRECORDS ' GO GET CORRECT RECORDS
' ---------------------------------------------------------------------------
' SCRLWIND EXIT WAS CAUSED BY ATTEMPT TO MOVE PAST THE END OF
' THE SCROLL WINDOW ( A$(ENTRIES%) ). PROGRAM ALSO MOVES HERE IF
' Mark (+) /Un-mark (-) WAS PRESSED ON THE LAST ENTRY IN THE SCROLL
' WINDOW.
CASE 12, 19 ' SCROLLING PAST THE END OF
' LIST IN THE SCROLL WINDOW.
DOWN:
IF ONLAST% = 0 THEN ' IF FILE POINTER IS ON
FILEPOINTER = FILEPOINTER + ENTRIES% - 1 ' FIRST ENTRY IN THE SCROLL
ONLAST% = 1 ' WINDOW MOVE IT TO THE
END IF ' LAST ENTRY.
IF LI% = ENTRIES% AND FILEPOINTER + 1 > MAXENTRIES THEN ' END OF FILE?
RTRN% = ENTRIES%
CALL DOSOUND ' MAKE BEEP AND DO NOTHING
NOREFRESH% = 1
ELSE ' NOT END OF FILE
IF ENTRIES% = ROWS% THEN
FILEPOINTER = FILEPOINTER + 1 ' INCREMENT FILEPOINTER
IF RK% = 12 THEN ' PAGE DOWN
IF FILEPOINTER + ROWS% - 1 > MAXENTRIES THEN ' END OF FILE?
FILEPOINTER = MAXENTRIES - ROWS% + 1 ' JUST LIKE "END"
END IF
GOSUB GETRECORDS ' PUT RECORDS IN A$()
ELSE ' MUST BE DOWN ARROW.
FOR X% = 1 TO ROWS% - 1 ' SHIFT SCROLL ENTRIES
SWAP A$(X%), A$(X% + 1) ' UP ONE.
NEXT
GET 1, FILEPOINTER, RECORD ' GET NEW LAST ENTRY.
A$(ENTRIES%) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
'FIX STRING REPRESENTING "MARKED" ENTRIES
SCROLLMARK$ = RIGHT$(SCROLLMARK$, ENTRIES% - 1) + RECORD.MARK
END IF
END IF
END IF
RTRN% = ENTRIES%
'----------------------------------------------------------------------------
' SCRLWIND EXIT WAS CAUSED BY AN ATTEMPT TO MOVE BEFORE THE FIRST
' ENTRY ( A$(START) ) IN THE SCROLL WINDOW.
CASE 11, 16 ' SCROLLING BEFORE START OF
' LIST IN SCROLL WINDOW
IF ONLAST% = 1 THEN ' IF FILEPOINTER = LAST SCROLL
FILEPOINTER = FILEPOINTER - ENTRIES% + 1 ' WINDOW ENTRY SET TO FIRST.
ONLAST% = 0
END IF
IF LI% = 1 AND FILEPOINTER = 1 THEN ' FIRST RECORD IN FIRST ROW.
CALL DOSOUND ' CAN'T MOVE UP.
NOREFRESH% = 1
ELSE
IF ENTRIES% = ROWS% THEN
IF RK% = 11 THEN ' MUST BE PAGE UP.
FILEPOINTER = FILEPOINTER - ROWS% ' MOVE UP ONE PAGE OF "RECORDS"
IF FILEPOINTER < 1 THEN FILEPOINTER = 1 ' BEFORE FIRST RECORD?
GOSUB GETRECORDS ' PUT RECORDS IN A$()
ELSE ' MUST BE UP ARROW.
FILEPOINTER = FILEPOINTER - 1 ' MOVE POINTER UP ONE IN FILE.
FOR X% = ROWS% TO 2 STEP -1 ' SHIFT RECORDS IF SCROLL LIST.
SWAP A$(X%), A$(X% - 1)
NEXT
GET 1, FILEPOINTER, RECORD ' GET A NEW FIRST RECORD
A$(1) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
'FIX STRING REPRESENTING "MARKED" ENTRIES
SCROLLMARK$ = RECORD.MARK + LEFT$(SCROLLMARK$, ENTRIES% - 1)
END IF
END IF
END IF
LIN% = 1: RTRN% = 1
END SELECT
GOTO MAKESCRL
'---------------------------------------------------------------------------
' READ RECORDS FROM THE FILE. READ UNTIL MAXIMUM NUMBER OF ENTRIES
' IN THE SCROLL WINDOWS ( ROWS% ) IS REACHED, OR UNTIL THE END
' OF FILE ( MAXENTRIES% ) IS REACHED.
GETRECORDS:
SCROLLMARK$ = SPACE$(ROWS%) ' MAKE STRING TO REPRESENT "MARKED" ENTRIES.
ENTRIES% = 0 ' ENTRIES IN SCROLL WINDOW.
WHILE ENTRIES% < ROWS% AND FILEPOINTER <= MAXENTRIES
ENTRIES% = ENTRIES% + 1 ' INCREMENT ENTRIES.
GET 1, FILEPOINTER, RECORD ' GET RECORD FROM THE FILE
FILEPOINTER = FILEPOINTER + 1 ' MOVE TO NEXT RECORD
' MAKE AN ENTRY IN THE SCROLL WINDOW
A$(ENTRIES%) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
' SET STRING REPRESENTING "MARKED" ENTRIES
MID$(SCROLLMARK$, ENTRIES%, 1) = RECORD.MARK
WEND
FILEPOINTER = FILEPOINTER - 1 ' ADJUST TO LAST RECORD IN SCROLL WINDOW.
ONLAST% = 1 ' SET FLAG TO SHOW FILE POINTER IS
' ON LAST RECORD IN SCROLL WINDOW.
SCROLLMARK$ = LEFT$(SCROLLMARK$, ENTRIES%) ' MAKE IT THE CORRECT LENGTH
' REQUIRED WHEN ENTRIES% < ROWS%
RETURN
'----------------------------------------------------------------------------